home *** CD-ROM | disk | FTP | other *** search
/ The 640 MEG Shareware Studio 5 / The 640 Meg Shareware Studio CD-ROM Volume V (Data Express)(1994).ISO / amiga / tdemo2.lha / ProgrammersInfo / DSKEL-BAL.c < prev    next >
C/C++ Source or Header  |  1994-06-05  |  10KB  |  391 lines

  1.  
  2. //                            SKEL-BAL v1.0
  3.  
  4. //                         (BBS ADD/LIST DOOR)
  5.  
  6. //**********************
  7. //*****  Includes  *****
  8. //**********************
  9.  
  10. #include <proto/all.h>
  11. #include <stdio.h>
  12.  
  13. #include <stdarg.h>
  14. #include <string.h>
  15. #include <tempest/headers.h>
  16.  
  17. //********************************
  18. //*****  Structures/Defines  *****
  19. //********************************
  20.  
  21.  struct MyMessage
  22.   {
  23.    struct Message Msg; // for Exec message routines
  24.    ULONG  Command;     // Command to be executed.
  25.  
  26.    char   *text1,
  27.           *text2,
  28.           *text3;
  29.    int    Value1,
  30.           Value2;
  31.    ULONG  LongValue;
  32.    LONGBITS Flags;
  33.    int    carrier;
  34.    struct User       *User;
  35.    struct SystemData *SystemData;
  36.    struct NodeData   *NodeData;
  37.    struct Today      *Today;
  38.   };
  39.  
  40. struct BBSLIST
  41.  {
  42.   char Name[21],
  43.        Number[21],
  44.        Location[21],
  45.        Sysop[21],
  46.        Groups[21],
  47.        Support[21],
  48.        Nodes[3],
  49.        Megs[5],
  50.        Baud[6];
  51.  };
  52.  
  53. struct BBSLIST BL;
  54. struct User *User;
  55. struct MsgPort *MyPort = NULL;
  56. struct MyMessage *msg;
  57. struct MyMessage send;
  58.  
  59. int  DoorStart(TEXT *);
  60. int  DOORIO(VOID);
  61. VOID CloseStuff(VOID);
  62.  
  63. VOID input(TEXT *,int);
  64. VOID LineInput(TEXT *,TEXT *,int);
  65. VOID pl(TEXT *,...);
  66.  
  67. char MyName[60],st[60];
  68. char string1[255],string2[255];
  69.  
  70. //******************
  71. //*****  Main  *****
  72. //******************
  73.  
  74. VOID main(int argc,char *argv[])
  75. {
  76.  int Test = 1;
  77.  if(!DoorStart(argv[1])) { PutStr("Tempest Door!\n"); exit(0); }
  78.  while(Test)
  79.   {
  80.    pl("\f[DSKEL-BAL v3.15BBS Add/List Door   By Michael Bockert [05-24-94]\r\n");
  81.    pl("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r\n");
  82.    pl("[A] -- Add a number to database.\r\n");
  83.    pl("[D] -- Delete a number from database.\r\n");
  84.    pl("[E] -- Edit a number in database.\r\n");
  85.    pl("[L] -- List Numbers in the database.\r\n");
  86.    pl("[S] -- Search for a number in database.\r\n");
  87.    pl("[Q] -- Quit back to the BBS.\r\n\r\n");
  88.    pl("Select [A,D,E,L,S,Q] : ");
  89.    input(string1,1);
  90.    if((string1[0] == 'q') || (string1[0] == 'Q')) Test = 0;
  91.    if((string1[0] == 'a') || (string1[0] == 'A')) New();
  92.    if((string1[0] == 'l') || (string1[0] == 'L')) List();
  93.    if((string1[0] == 'e') || (string1[0] == 'E')) Edit();
  94.   }
  95.  CloseStuff();
  96. }
  97.  
  98. //*************************
  99. //*****  List Entrys  *****
  100. //*************************
  101.  
  102. List(VOID)
  103. {
  104.  int fd,stat,lines;
  105.  lines=0;
  106.  fd=Open("DOORS:DSKEL-BAL.Data",MODE_OLDFILE);
  107.  if(fd==0) { pl("Error reading Doors:DSKEL-BAL.Data\n\r"); return(0); }
  108.  
  109.  pl("\f");
  110.  ReadRecord:
  111.  stat=Read(fd,(char *)&BL,sizeof(struct BBSLIST));
  112.  if(stat<=0)
  113.   {
  114.    pl("Hit any key:");
  115.    hotkey(string1);
  116.    Close(fd);
  117.    return(0);
  118.   }
  119.  pl("   [Name%-20s      %s Nodes]      [Sysop%-20s\r\n",
  120.      BL.Name,BL.Nodes,BL.Sysop);
  121.  pl("  [Phone%-20s     [%4s Megs]     [Groups%-20s\r\n",
  122.      BL.Number,BL.Megs,BL.Groups);
  123.  pl("[Located%-20s    [%5s Baud]    [Support%-20s\r\n\r\n",
  124.                     BL.Location,BL.Baud,BL.Support);
  125.  lines+=4;
  126.  if(lines+4>User->Length)
  127.   {
  128.    pl("Hit any key:");
  129.    hotkey(string1);
  130.    lines=0;
  131.    pl("\r\n\r\n");
  132.   }
  133.  goto ReadRecord;
  134. }
  135.  
  136. //***************************
  137. //*****  Add New Entry  *****
  138. //***************************
  139.  
  140. New(VOID)
  141. {
  142.  int fd;
  143.  pl("\f                    [--------------------]\r\n");
  144.  pl("           BBS Name: ");
  145.  input(BL.Name,20);
  146.  pl("\r\n                    [--------------------]\r\n");
  147.  pl("       Phone Number: ");
  148.  input(BL.Number,20);
  149.  pl("\r\n                    [--------------------]\r\n");
  150.  pl("             Groups: ");
  151.  input(BL.Groups,20);
  152.  pl("\r\n                    [--------------------]\r\n");
  153.  pl("           Location: ");
  154.  input(BL.Location,20);
  155.  pl("\r\n                    [--------------------]\r\n");
  156.  pl("              Sysop: ");
  157.  input(BL.Sysop,20);
  158.  pl("\r\n                    [--------------------]\r\n");
  159.  pl("  Formats Supported: ");
  160.  input(BL.Support,20);
  161.  pl("\r\n                    [-]\r\n");
  162.  pl("            # Nodes: ");
  163.  input(BL.Nodes,1);
  164.  pl("\r\n                    [----]\r\n");
  165.  pl("    Megs of Storage: ");
  166.  input(BL.Megs,4);
  167.  pl("\r\n                    [-----]\r\n");
  168.  pl("      Max Buad Rate: ");
  169.  input(BL.Baud,5);
  170.  pl("\r\nSave to database [y/n");
  171.  input(string1,1);
  172.  if((string1[0] =='n') || (string1[0] == 'N')) return(0);
  173.  
  174. //***********************************
  175. //*****  Write DSKEL-BAL.Data  ******
  176. //***********************************
  177.  
  178.  fd=Open("DOORS:DSKEL-BAL.Data",MODE_OLDFILE);
  179.  if(fd==0)
  180.   {
  181.    fd=Open("DOORS:DSKEL-BAL.Data",MODE_NEWFILE);
  182.    if(fd==0)
  183.     {
  184.      pl("Error writing Doors:DSKEL-BAL.Data!\r\n");
  185.      CloseStuff();
  186.    }
  187.   }
  188.  else
  189.    Seek(fd,0,OFFSET_END);
  190.  Write(fd,(char *)&BL ,sizeof(struct BBSLIST));
  191.  Close(fd);
  192.  return(0);
  193. }
  194.  
  195. //*************************
  196. //*****  Edit Entrys  *****
  197. //*************************
  198.  
  199. Edit(VOID)
  200. {
  201.  char string[255];
  202.  int fd,Slot;
  203.  long Position;
  204.  pl("Edit which Entry?: ");
  205.  input(string,3);
  206.  Slot = atoi(string);
  207.  fd=Open("DOORS:DSKEL-BAL.Data",MODE_OLDFILE);
  208.  if(fd==0)
  209.   {
  210.    pl("Error reading Doors:DSKEL-BAL.Data\n\r"); return(0);
  211.   }
  212.  Slot--;
  213.  Position = Slot * sizeof(struct BBSLIST);
  214.  Seek(fd,Position,0);
  215.  Read(fd,(char *)&BL,sizeof(struct BBSLIST));
  216.  Close(fd);
  217.  pl("\f                    [--------------------]\r\n");
  218.  pl("           BBS Name: ");
  219.  LineInput(BL.Name,string,20);
  220.  strcpy(BL.Name,string);
  221.  pl("\r\n                    [--------------------]\r\n");
  222.  pl("       Phone Number: ");
  223.  LineInput(BL.Number,string,20);
  224.  strcpy(BL.Number,string);
  225.  pl("\r\n                    [--------------------]\r\n");
  226.  pl("             Groups: ");
  227.  LineInput(BL.Groups,string,20);
  228.  strcpy(BL.Groups,string);
  229.  pl("\r\n                    [--------------------]\r\n");
  230.  pl("           Location: ");
  231.  LineInput(BL.Location,string,20);
  232.  strcpy(BL.Location,string);
  233.  pl("\r\n                    [--------------------]\r\n");
  234.  pl("              Sysop: ");
  235.  LineInput(BL.Sysop,string,20);
  236.  strcpy(BL.Sysop,string);
  237.  pl("\r\n                    [--------------------]\r\n");
  238.  pl("  Formats Supported: ");
  239.  LineInput(BL.Support,string,20);
  240.  strcpy(BL.Support,string);
  241.  pl("\r\n                    [-]\r\n");
  242.  pl("            # Nodes: ");
  243.  LineInput(BL.Nodes,string,1);
  244.  strcpy(BL.Nodes,string);
  245.  pl("\r\n                    [----]\r\n");
  246.  pl("    Megs of Storage: ");
  247.  LineInput(BL.Megs,string,4);
  248.  strcpy(BL.Megs,string);
  249.  pl("\r\n                    [-----]\r\n");
  250.  pl("      Max Buad Rate: ");
  251.  LineInput(BL.Baud,string,5);
  252.  strcpy(BL.Baud,string);
  253.  pl("\r\nSave changes to database [y/n");
  254.  input(string1,1);
  255.  if((string1[0] =='n') || (string1[0] == 'N')) return(0);
  256.  
  257. //***********************************
  258. //*****  Write DSKEL-BAL.Data  ******
  259. //***********************************
  260.  
  261.  fd=Open("DOORS:DSKEL-BAL.Data",MODE_OLDFILE);
  262.  if(fd==0)
  263.     pl("Error writing Doors:DSKEL-BAL.Data!\r\n");
  264.  else
  265.  Seek(fd,Position,0);
  266.  Write(fd,(char *)&BL ,sizeof(struct BBSLIST));
  267.  Close(fd);
  268.  return(0);
  269. }
  270.  
  271.  
  272.  
  273.  
  274.  
  275.  
  276.  
  277.  
  278.  
  279. //************************
  280. //*****  Door Start  ***** // MUST BE INCLUDED IN ALL DOORS!
  281. //************************
  282.  
  283. int DoorStart(TEXT *node)
  284. {
  285.  struct MsgPort *HisPort;
  286.  send.carrier=0;
  287.  sprintf(st,"%s:TEMPEST_DOOR",node);
  288.  HisPort = FindPort(st);
  289.  if(HisPort==NULL) return (FALSE);
  290.  sprintf(MyName,"%s:DOOR_PORT",node);
  291.  MyPort = CreatePort(MyName,0L);
  292.  if(MyPort==NULL)
  293.   {
  294.    PutStr("Cant open port");
  295.    return(int)FALSE;
  296.   }
  297.  DOORIO();
  298.  User=*&send.User;
  299.  return (int)TRUE;
  300. }
  301.  
  302. //********************
  303. //*****  DoorIO  ***** // MUST BE INCLUDED IN ALL DOORS!
  304. //********************
  305.  
  306. int DOORIO(VOID)
  307. {
  308.  struct MsgPort *HisPort;
  309.  if(send.carrier) return(0);
  310.  HisPort = FindPort(st);
  311.  if(HisPort!=NULL)
  312.   {
  313.    send.Msg.mn_Node.ln_Type = NT_MESSAGE;
  314.    send.Msg.mn_Length = sizeof(send);
  315.    send.Msg.mn_ReplyPort = MyPort;
  316.    send.carrier=0;
  317.    PutMsg((struct MsgPort *)HisPort,(struct Message *)&send);
  318.    Wait(1 << MyPort->mp_SigBit);
  319.    GetMsg(MyPort);
  320.    if(send.carrier) CloseStuff();
  321.    return(1);
  322.   }
  323.  return(0);
  324. }
  325.  
  326. //*************************
  327. //*****  Close Stuff  ***** // MUST BE INCLUDED IN ALL DOORS!
  328. //*************************
  329.  
  330. VOID CloseStuff(VOID)
  331. {
  332.  send.Command=999;
  333.  DOORIO();
  334.  while(msg=(struct MyMessage *)GetMsg(MyPort)) ReplyMsg((struct Message *)msg);
  335.  if(MyPort) DeletePort(MyPort);
  336.  exit(0);
  337. }
  338.  
  339. //*********************
  340. //*****  Hot Key  ***** // Command 16
  341. //*********************
  342.  
  343. int hotkey(TEXT *character)
  344. {
  345.  send.Command=16;
  346.  send.text1=character;
  347.  DOORIO();
  348.  return((int)character[0]);
  349. }
  350.  
  351. //*******************
  352. //*****  Input  ***** // Command 20
  353. //*******************
  354.  
  355. VOID input(TEXT *mstring,int len)
  356. {
  357.  send.Command=20;
  358.  send.Value1=len;
  359.  send.text1 =mstring;
  360.  DOORIO();
  361. }
  362.  
  363. //************************
  364. //*****  Line Input  ***** // Command 22
  365. //************************
  366.  
  367. VOID LineInput(TEXT *ostring,TEXT *mstring,int len)
  368. {
  369.  send.Command=22;
  370.  send.Value1=len;
  371.  send.text1=mstring;
  372.  send.text2=ostring;
  373.  DOORIO();
  374. }
  375.  
  376. //*****************************
  377. //*****  PL (Print Line)  ***** // Command 1 with a twist
  378. //*****************************
  379.  
  380. VOID pl(TEXT *fmt,...)
  381. {
  382.  va_list args;
  383.  char s[255];
  384.  va_start(args,fmt);
  385.  vsprintf(s,fmt,args);
  386.  va_end(args);
  387.  send.Command=1;
  388.  send.text1=&s[0];
  389.  DOORIO();
  390. }
  391.